import numpy as np
import cv2 as cv

# 读取视频文件
cap = cv.VideoCapture('bike.mp4')

# 循环播放视频文件，同时显示原视频及其对应的灰度图
while cap.isOpened():
    # 逐帧读取视频，ret 为布尔值，表示是否成功读取帧，frame 为当前帧的图像数据
    ret, frame = cap.read()
    # 循环播放视频文件，同时显示原视频及其对应的灰度图
    while cap.isOpened():
        # 逐帧读取视频，ret 为布尔值，表示是否成功读取帧，frame 为当前帧的图像数据
        ret, frame = cap.read()
        if not ret:
            print("没有内容，退出啦 :) ")
            break
        # 使用 cv2.cvtColor() 将当前帧的彩色图像转换为灰度图
        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
        #  获得傅里叶系数
        fCoef = np.fft.fft2(gray)

        #mg_spec图像
        mag_spec = 20 * np.log(np.abs(fCoef))# 放大傅里叶系数，获得幅度谱(振幅谱）
        # 另一种常见写法: mag_spec = np.log(np.abs(fCoef)+1)
        #对振幅谱进行归一化处理
        mag_spec_norm = (mag_spec - np.min(mag_spec)) / np.ptp(mag_spec)
        #np.ptp=np.max(mag_spec)-np.min(mag_spec)实现极大极小值归一
        #mg_spc_shift图像

        fCoef_shifted = np.fft.fftshift(fCoef)  # 将低频部分移至中心
        # 计算振幅谱及其变换
        msp_shifted = 20 * np.log(np.abs(fCoef_shifted))  # 计算平移后傅里叶系数对应的振幅谱
        #对振幅谱进行归一化处理
        msp_spec_norm = (msp_shifted - np.min(msp_shifted)) / np.ptp(msp_shifted)
        # 在名为 "gray" 的窗口中显示灰度图像
        cv.imshow('gray', gray)
        cv.imshow('mg_spec',mag_spec_norm)
        cv.imshow('mg_spc_shift',msp_spec_norm)

        # 每隔 1ms 检查一次用户输入，如果按下 'q' 键，退出循环
        if cv.waitKey(1) == ord('q'):
            break

# 释放视频捕捉资源
cap.release()
# 关闭所有的 GUI 窗口
cv.destroyAllWindows()

